import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
//        System.out.println("请输入n的值");
//        int n = sc.nextInt();
//        int sum = sumOfFactorial(n);
//        System.out.println("sum=" + sum);

//        int sum = factorial(n);
//        System.out.println("sum=" + sum);

//        System.out.println("请输入想要比较的三个值");
//        int a = sc.nextInt();
//        int b = sc.nextInt();
//        int c = sc.nextInt();
//        int max = compareThreeNum(a,b,c);
//        System.out.println("最大值为" + max);

//        int a1 = 4;
//        int b1 = 7;
//        double a2 = 5.6;
//        double b2 = 7312.34;
//        int maxOfInt = whoIsBigger(a1,b1);
//        double maxOfDouble = whoIsBigger(a2,b2);
//        System.out.println("最大值为：" + maxOfInt);
//        System.out.println("最大值为：" + maxOfDouble);

//        int a1 = 3;
//        int b1 = 4;
//        double a2 = 132.4354;
//        double b2 = 211.342;
//        double c2 = 3.14;
//        int sum1 = sumOfTwoInt(a1,b1);
//        double sum2 = sumOfThreeDouble(a2,b2,c2);
//        System.out.println("sum=" + sum1);
//        System.out.println("sum=" + sum2);

//        System.out.println("请输入一共有多少台阶：");
//        int n = sc.nextInt();
//        int[] count = new int[] {0};
//        frogJumpSteps(n,count);
//        System.out.println("一共有" + count[0] + "种方法");

        hanoi(3,'A','B','C');

//        int n = 20;
//        long num = fibo(n);
//        System.out.println("第N项斐波那契数列为：" + num);

//        int n = 1234;
//        int num = sum(n);
//        System.out.println("数字之和为：" + num);

//        int n= 1234;
//        System.out.println(n + "的每一位数为：");
//        printEeahNum(n);

//        int sum = numSum(10);
//        System.out.println("1 ~ 10的和为：" + sum);

//        int n = factorialOfNum(5);
//        System.out.println("N的阶乘为：" + n);
    }

    //12.递归求 N 的阶乘
    private static int factorialOfNum(int i) {
        if(i == 1){
            return 1;
        }
        return i * factorialOfNum(i - 1);
    }

    //11.递归求 1 + 2 + 3 + ... + 10
    public static int numSum(int n) {
        if(n == 1){
            return 1;
        }
        return n + numSum(n - 1);
    }

    //10.按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4) （递归）
    public static void printEeahNum(int n) {
        if(n == 0){
            return;
        }
        printEeahNum(n / 10);
        System.out.print(n % 10 + " ");
    }

    //9.写一个递归方法，输入一个非负整数，返回组成它的数字之和
    public static int sum(int n) {
        if(n < 10){
            return n;
        }
        return n % 10 + sum(n / 10);
    }

    //8.递归求斐波那契数列的第 N 项
    public static long fibo(int n) {
        if(n == 1 || n == 2){
            return 1;
        }
        return fibo(n - 1) + fibo(n - 2);
    }

    //7.递归求解汉诺塔问题
    public static void hanoi(int num,char a,char b,char c){
        if(num == 1){
            System.out.println("第" + num + "个盘子从" + a +"移动到" + c);
            return;
        }
        hanoi(num - 1,a,c,b);//将n - 1个盘子从A移动到B，C作为辅助
        System.out.println("第" + num + "个盘子从" + a +"移动到" + c);//将第n个盘子从A移动到C
        hanoi(num - 1,b,a,c);//将n - 1个盘子从B移动到C，A作为辅助
    }

    //6.青蛙跳台阶问题
    public static void frogJumpSteps(int n,int[] count) {
        if(n == 0){
            count[0]++;
        }
        if(n < 0){
            return;
        }
        frogJumpSteps(n - 1,count);
        frogJumpSteps(n - 2,count);
    }

    //5.在同一个类中,分别定义求两个整数的方法 和 三个小数之和的方法。 并执行代码，求出结果
    public static int sumOfTwoInt(int a1, int b1) {
        return a1 + b1;
    }

    public static double sumOfThreeDouble(double a2, double b2, double c2) {
        return a2 + b2 + c2;
    }


    //4.在同一个类中定义多个方法：要求不仅可以求两个整数的最大值，还可以求两个小数的最大值，以及两个小数和一个整数的大小关系
    public static int whoIsBigger(int a, int b) {
        if(a > b){
            return a;
        }
        return b;
    }

    public static  double whoIsBigger(double a, double b) {
        if(a > b){
            return a;
        }
        return b;
    }

    //3.创建方法求两个数的最大值max2，随后再写一个求3个数的最大值的函数max3。
    //要求：在max3这个函数中，调用max2函数，来实现3个数的最大值计算
    public static int compareThreeNum(int a, int b, int c) {
        if(firIsBiggerThanSec(a,b)){//a > b
            if(firIsBiggerThanSec(a,c)){//a > c
                return a;
            }
            else{//a < c
                return c;
            }
        }
        else{//a < b
            if(firIsBiggerThanSec(b,c)){//b > c
                return b;
            }
            else{//b < c
                return c;
            }
        }
    }

    public static boolean firIsBiggerThanSec(int a, int b) {
        if(a > b){
            return true;
        }
        return false;
    }

    //1.求1！+2！+3！+4！+........+n!的和
    public static int sumOfFactorial(int n) {
        int sum = 0;
        for (int i = 1; i <= n; i++) {
            sum += factorial(i);
        }
        return sum;
    }
    //2.求 N 的阶乘
    public static int factorial(int i) {
        if(i == 1){
            return 1;
        }
        return i * factorial(i - 1);
    }
}
